#include <mylib/device/key.h>
#include <mylib/driver/systick.h>
#include <mylib/utility/debug.h>

// 按键列表，存放了指针，指向按键结构体
static key_t* g_key_list[KEY_LIST_MAX_SIZE] = {0};
// 按键列表的当前的个数，初始化为0
static uint8_t g_key_list_size = 0;

// 将一个按键添加到按键列表中
bool key_add(key_t* key)
{
    if (g_key_list_size < KEY_LIST_MAX_SIZE) {
        g_key_list[g_key_list_size++] = key;
    }
    else {
        return false;
    }
    return true;
}

// 扫描按键，返回按键值，如果没有按键按下，返回KEY_VALUE_NO_KEY
int32_t key_scan(void)
{
#if PLATFORM_STM32
    for (uint8_t i = 0; i < g_key_list_size; i++) {
        if (HAL_GPIO_ReadPin(g_key_list[i]->port, g_key_list[i]->pin) == g_key_list[i]->valid) {
            // 过10ms再次扫描
            // 用于判断按键是否是真的按下
            //systick_delay_ms(10);   // 10ms
            if (HAL_GPIO_ReadPin(g_key_list[i]->port, g_key_list[i]->pin) == g_key_list[i]->valid) {
                while (HAL_GPIO_ReadPin(g_key_list[i]->port, g_key_list[i]->pin) >
                       0);   // 等待按键释放
                return g_key_list[i]->key_val;
            }
        }
    }

#elif PLATFORM_MSPM0
    for (uint8_t i = 0; i < g_key_list_size; i++) {
        if (DL_GPIO_readPins(g_key_list[i]->port, g_key_list[i]->pin) == g_key_list[i]->valid) {
            systick_delay_ms(10);   // 20ms
            if (DL_GPIO_readPins(g_key_list[i]->port, g_key_list[i]->pin) == g_key_list[i]->valid) {
                // DEBUG_INFO("if (DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_18) == 0)");
                while (DL_GPIO_readPins(g_key_list[i]->port, g_key_list[i]->pin) >
                       0);   // 等待按键释放
                return g_key_list[i]->key_val;
            }
        }
    }
#endif
    return KEY_VALUE_NONE;
}
